package com.beiing.tianshuai.tianshuai.base;

/**
 * Created by Jinni on 2017/7/20 0020.
 */

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.beiing.tianshuai.tianshuai.widget.FooterView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 与数据源相关的字段和方法封装在父类中
 */

public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter {
    protected List<T> mList = new ArrayList<>();
    protected FooterView mFooterView;

    public FooterView getFooterView() {
        return mFooterView;
    }

    public void updateData(List<T> dataSet) {
        this.mList.clear();
        appendData(dataSet);
    }

    public View getConvertView(Context context, int layoutId, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(layoutId, parent, false);
    }

    /**
     * 更新数据
     *
     * @param data     要更新的数据源
     * @param position 要更新的条目位置
     */
    public void updateData(T data, int position) {
        mList.set(position, data);
        notifyItemChanged(position);
    }

    /**
     * 追加数据集合
     *
     * @param dataSet 要追加的数据源内容
     */
    public void appendData(List<T> dataSet) {
        if (dataSet != null && !dataSet.isEmpty()) {
            this.mList.addAll(dataSet);
            notifyDataSetChanged();
        }
    }

    /**
     * 但条目数据追加
     *
     * @param project 要追加的数据源内容
     */
    public void appendData(T project) {
        this.mList.add(project);
        notifyDataSetChanged();
    }

    /**
     * 在指定位置插入一条新的数据
     *
     * @param project  要追加的数据源内容
     * @param position 插入新数据源的位置
     */
    public void appendData(T project, int position) {
        this.mList.add(project);
        notifyItemInserted(position);
    }

    /**
     * 清除当前recycler view的所有内容
     */
    public void clearData() {
        if (mList != null && !mList.isEmpty()) {
            this.mList.clear();
            notifyDataSetChanged();
        }
    }

    // 添加数据
    public void addData(int position, T object) {
        // 在list中添加数据，并通知条目加入一条
        mList.add(position, object);
        notifyItemInserted(position);
    }

    // 添加数据
    public void addData(T object) {
        // 在list中添加数据，并通知条目加入一条
        mList.add(object);
        notifyItemInserted(mList.size() - 1);
    }

    /**
     * 删除指定位置的数据
     *
     * @param position 要删除数据的位置
     */
    public void removeData(int position) {
        if (!mList.isEmpty() && position < mList.size()) {
            mList.remove(position);
            if (mList.isEmpty()) {
                notifyDataSetChanged();
            } else {
                notifyItemRemoved(position);
            }
        }
    }

    public List<T> getList() {
        return mList;
    }

    @Override
    public int getItemCount() {
        if (mList != null) {
            return mList.size();
        } else {
            return 0;
        }
    }

    /**
     * 交换位置
     *
     * @param srcPosition    所选择的位置
     * @param targetPosition 目标位置
     */
    public void swapMoved(int srcPosition, int targetPosition) {
        if (!mList.isEmpty() && mList.size() > Math.max(srcPosition, targetPosition)) {
            //这里的处理需要注意下
            if (srcPosition < targetPosition) {
                for (int i = srcPosition; i < targetPosition; i++) {
                    Collections.swap(mList, i, i + 1);
                }
            } else if (srcPosition > targetPosition) {
                for (int i = srcPosition; i > targetPosition; i--) {
                    Collections.swap(mList, i, i - 1);
                }
            }
            notifyItemMoved(srcPosition, targetPosition);
        }
    }

    /**
     * 获取当前列表中的最后一个item
     *
     * @return 最后一个item的bean
     */
    public T getLastItem() {
        T t = null;
        if (!mList.isEmpty()) {
            t = mList.get(mList.size() - 1);
        }
        return t;
    }

    /**
     * 判断当前adapter的数据集合是否为空
     *
     * @return 是否为空
     */
    public boolean isEmpty() {
        return mList.isEmpty();
    }

    public static class FooterViewHolder extends RecyclerView.ViewHolder {

        public FooterViewHolder(View footerView) {
            super(footerView);
        }
    }

    public boolean isFooter(int position) {
        return mList.size() == position;
    }

    public void setFooterViewStatus(int status) {
        if (mFooterView != null) {
            mFooterView.setStatus(status);
        }
    }
}